/**
 ****************************************************************************************************
 * @file        foc_current.c
 * @author      哔哩哔哩-Rebron大侠
 * @version     V0.0
 * @date        2025-01-11
 * @brief       电流相关
 * @license     MIT License
 *              Copyright (c) 2025 Reborn大侠
 *              允许任何人使用、复制、修改和分发该代码，但需保留此版权声明。
 ****************************************************************************************************
 */

#include "foc_current.h"
#include "foc_port.h"
#include <adc.h>
#include <stdbool.h>
#include <foc_motor.h>

/*打开低侧开关, 电机启动时对电容需要进行充电*/
void FOC_turnOn_LowSide(void)
{
    U_H_SET_PWM(0);
    V_H_SET_PWM(0);
    W_H_SET_PWM(0);
}

/*电流校准
返回0完成 其他未完成
*/
int FOC_Current_Calib(FOC_CURRENT_t *foc_current)
{
    int ret = -1;
    switch(foc_current->state){
        case START_CALIB:               
            FOC_turnOn_LowSide();                   /*拉低PWM输出*/
            foc_current->charge_cap_ticks = 0;
            foc_current->calibration_count = 0;
        
            foc_current->state = CAP_CAHGE;         /*电容充电中*/
            break;
        case CAP_CAHGE:
            if((foc_current->charge_cap_ticks++)>20000){

                FOC_Port_Pwm_Stop();            /*关闭PWM*/

                foc_current->mcu_ad_A = 0;
                foc_current->mcu_ad_B = 0;
                foc_current->mcu_ad_C = 0;

                foc_current->_A_ad_offset = 0;
                foc_current->_B_ad_offset = 0;
                foc_current->_C_ad_offset = 0;

                foc_current->state = CALIBING;      /*20k频率， 充电1s*/
            }
            break;
        case CALIBING:
            foc_current->calibration_count++;
            if((foc_current->calibration_count)>=CALIBRATION_TIMES){   /*校准1s*/
                
                foc_current->_A_ad_offset =  foc_current->mcu_ad_A/CALIBRATION_TIMES - 2068;
                foc_current->_B_ad_offset =  foc_current->mcu_ad_B/CALIBRATION_TIMES - 2068;
                foc_current->_C_ad_offset =  foc_current->mcu_ad_C/CALIBRATION_TIMES - 2068;

                FOC_Port_Pwm_Start();       /*启动PWM*/
                foc_current->state = START_CALIB; 
                ret = 0;
            }
        default:
            break;
    }
    return ret;
}

/*过流检测*/
bool FOC_Current_Over(FOC_CURRENT_t *FOC_CURRENT, qd_t I_qd)
{
    if(fabsf(I_qd.q)>FOC_CURRENT->over||fabsf(I_qd.d)>FOC_CURRENT->over){
        FOC_CURRENT->cur_over_count+=2;
    }else{
        if(FOC_CURRENT->cur_over_count>0){
            FOC_CURRENT->cur_over_count--;
        }
    }

    if(FOC_CURRENT->cur_over_count>100000){
        FOC_CURRENT->cur_over_count = 0;
        return true;
    }else{
        return false;
    }
}
